package com.zmn.plat.business.interfaces.price;

import com.zmn.plat.common.dto.brand.BaseBrandDRO;
import com.zmn.plat.common.dto.price.ItemTo;
import com.zmn.plat.common.dto.price.meter.*;
import com.zmn.plat.common.dto.product.tariff.TariffBackProductDRO;
import com.zmn.plat.common.dto.product.tariff.TariffProductDRO;
import com.zmn.plat.common.dto.product.tariff.category.TariffCategoryDRO;
import com.zmn.plat.common.dto.product.tariff.category.TariffCategoryPageDRO;
import com.zmn.plat.common.dto.product.tariff.servcategory.TariffServCategoryDRO;
import com.zmn.plat.common.dto.servcategory.ServCategoryChildrenDRO;
import com.zmn.plat.model.dto.product.ProductRelationDTO;
import com.zmn.plat.model.entity.product.ServProduct;

import java.util.List;


/**
 * 描述: 计价器流程接口类（所有接口前提是有计价器试点，接口是按照操作顺序）
 *
 * @author guoqiao
 * @since 2021/8/13 16:34
 */
public interface MeterFlowBService {

    /**
     * 描述: 1.获取有计价器产品的服务品类
     *
     * @param channelId 渠道id
     * @param cityId    城市id
     * @return List<ServCategoryChildrenDRO>
     * @author guoqiao
     * @since 2021/9/17 13:53
     */
    List<ServCategoryChildrenDRO> listServAndCategByChannelIdAndCity(Integer channelId, Integer cityId);

    /**
     * 描述: 2.获取有计价器产品的二级分类
     *
     * @param channelId 渠道id
     * @param cityId    城市id
     * @return TariffCategoryPageDRO
     * @author guoqiao
     * @since 2021/9/17 13:53
     */
    TariffCategoryPageDRO listTwoCategByChannelIdAndCity(Integer channelId, Integer cityId);

    /**
     * 描述: 3.根据关键字搜索产品二级分类
     *
     * @param query
     * @return List<TariffCategoryDRO>
     * @author guoqiao
     * @since 2021/9/13 14:42
     */
    List<TariffCategoryDRO> listFtCategByQuery(MeterFtCategQuery query);

    /**
     * 描述: 4.根据前台产品二级分类查询服务分类
     *
     * @param query
     * @return List<TariffServCategoryDRO>
     * @author guoqiao
     * @since 2021/9/23 14:42
     */
    List<TariffServCategoryDRO> listServByQuery(MeterServQuery query);

    /**
     * 描述: 5.根据前台产品服务分类、二级分类查询计价器产品
     *
     * @param query
     * @return List<TariffProductDRO>
     * @author guoqiao
     * @since 2021/10/8 11:44
     */
    List<TariffProductDRO> listTariffProductByQuery(MeterFtProductQuery query);

    /**
     * 描述: 6.根据前台产品或计价器产品查询品牌
     *
     * @param query
     * @return List<BaseBrandDRO>
     * @author guoqiao
     * @since 2021/10/8 16:10
     */
    List<BaseBrandDRO> listBrandByQuery(MeterBrandQuery query);

    /**
     * 描述: 7.根据项目类型查询项目
     *
     * @param query
     * @return List<ItemTo>
     * @author guoqiao
     * @since 2021/10/8 16:10
     */
    List<ItemTo> listItemByQuery(MeterItemQuery query);

    /**
     * 描述: 8.根据计价器产品查询后台二级分类
     *
     * @param query
     * @return List<TariffCategoryDRO>
     * @author guoqiao
     * @since 2021/10/8 16:10
     */
    List<TariffCategoryDRO> listBkCategByQuery(MeterBkCategQuery query);

    /**
     * 描述: 9.根据计价器产品查询后台产品
     *
     * @param query
     * @return List<TariffBackProductDRO>
     * @author guoqiao
     * @since 2021/10/8 16:10
     */
    List<TariffBackProductDRO> listBkProductByQuery(MeterBkProductQuery query);

    /**
     * 描述: 10.计价器报价
     *
     * @param query
     * @return List<ItemTo>
     * @author guoqiao
     * @since 2021/10/8 16:10
     */
    List<ItemTo> listQuoteByQuery(MeterQuoteQuery query);

    /**
     * 描述: 11.计价器报价（后台产品二级分类或后台产品不清楚）
     *
     * @param query
     * @return List<MeterQuoteUnknowDRO>
     * @author guoqiao
     * @since 2021/10/8 16:10
     */
    List<MeterQuoteUnknowDRO> listQuoteUnknowByQuery(MeterQuoteUnknowQuery query);

    /**
     * 描述: 12.根据后台产品id和项目类型查询项目价格
     *
     * @param query
     * @return List<ItemTo>
     * @author guoqiao
     * @since 2021/10/8 16:10
     */
    List<ItemTo> listItemPriceByItemCategId(MeterItemPriceQuery query);

    /**
     * 描述: 13.根据后台产品id和收费标准查询项目价格
     *
     * @param query
     * @return List<ItemTo>
     * @author guoqiao
     * @since 2021/10/8 16:10
     */
    List<ItemTo> listItemPriceByPriceStandard(MeterItemPriceQuery query);


    /********************************* 以下是内部调用的接口 *********************************/

    /**
     * 描述: 根据渠道id和城市查询支持计价器的产品（公共内部方法，供1.2.3.4接口调用）
     *
     * @param channelId 渠道id
     * @param cityId    城市id
     * @param bizType   业务类型
     * @param categId   计价器产品二级分类id 选中后
     * @param categName 计价器产品分类名称 搜索关键字
     * @return List<ServProduct>
     * @author guoqiao
     * @since 2021/8/11 9:24
     */
    List<ServProduct> listServProductForTariff(Integer channelId, Integer cityId, Integer bizType, Integer categId, String categName);

    /**
     * 描述: 查询符合条件的产品关系数据（公共内部方法，供5.6.7.8.9.10.11.12接口调用）
     * 1.查询产品关系数据；2.查询价格表；3.筛选出价格表优先的数据；4.过滤满足品牌的数据
     *
     * @param dto
     * @return List<ProductRelationDTO>
     * @author guoqiao
     * @since 2021/10/9 15:57
     */
    List<ProductRelationDTO> listProductRelationDTO(RelationQueryDTO dto);

    /**
     * 描述: 服务项目计算价格（公共内部方法，供10.11.12接口调用）
     *
     * @param dto
     * @return List<ItemTo>
     * @author guoqiao
     * @since 2021/10/9 15:57
     */
    List<ItemTo> listItemToByDto(QuoteQueryDTO dto);


}
